Introducing version 3 of wls_config

Introducing `wls-config` V3 Recently we have released version 3 of the wls_config module. This release shows our commitment to add more stability, better documentation and new features to our commercial modules compared to the Open Source versions. In this blog post, we will describe the changes.

Overview of the changes

This version is a major rewrite of the module. The changes comprise of:

  • Support for Puppet 4
  • Support for OracleLinux 7, RHEL and CentOS 7
  • Support for WebLogic 12.2
  • Better property domain checking
  • Added much better error reporting
  • Added support for a lot more properties
  • Better documentation of the properties
  • support for absent parameters

In the rest of this article, we will cover these changes in more detail.

New versions

The world around us is moving on. So we are moving on as well. This version has full support for all the newest versions of the products it is related to. It runs on the latest versions of Puppet Enterprise. We also still support running on the Open Source version of Puppet. Although it already worked for a long time, the module is also supported on version 7 of RHEL, OracleLinux and CentOS.

As for WebLogic, we now also fully support WebLogic 12.2.1. We have planned further enhancements for this versions.

When things go wrong

WebLogic is a large and complex software product, Version 2 of wls_config helped a lot of customers to get going with the WebLogic custom types and build complex configurations. We noticed however that as long as everything is correct, you are in for a breeze. However, when things are wrong, you are in for a long and hard search.

Sometimes you’ll have to wait for a WebLogic timeout to occur to get an error message that might not help you that much. In version 3 of the wls_config module, we have added a lot of functionality to help you.

Domain checks on properties

We felt that the best way to help you is to report errors in the specified values as soon as possible. That is why we added a lot of checks on the properties. For a lot of properties, version 3 of wls_config will report an error during the compile of the catalog if you have specified an incorrect value. Here is an example of an incorrect value being reported:

wls_jms_connection_factory { "${domain_name}/jmsClusterModule:cf":
  defaulttargeting          => '0',
  jndiname                  => 'jms/cf',
  clientidpolicy            => 'Restrictedd', # See the extra d at the end that causes the error
  subdeployment             => 'wlsServers',
  xaenabled                 => '0',
}

Applying this manifest results in:

$ puppet apply site.pp
Notice: Compiled catalog for wls1.example.com in environment production in 19.11 seconds
Error: Parameter clientidpolicy failed on Wls_jms_connection_factory[wlsonly/jmsClusterModule:cf]: Invalid value "Restrictedd". Valid values are absent, Restricted, Unrestricted.  at /etc/puppetlabs/code/environments/production/modules/profile/manifests/wls/wlsonly/jms.pp:81

Error reporting

Unfortunately, we cannot do domain checking on all properties at compile time. Some of the properties are dynamic and will change during the run. In the old days, errors on those properties would lead to longs waits and challenging error messages. In version 3 we have significantly improved on that. Here is an example of an error being reported:

New error report

The report shows you the property being set, the value being used and the error generated by WebLogic. This combination makes searching for errors much easier. We have noticed huge improvements in our productivity.

Enterprises

Although version 2 of the modules support a lot of types and a lot of properties, we noticed big business always tend to use just the property we didn’t support. To remedy this, we have added a huge set of properties to all types. To keep the manifests readable and the puppet runs up to speed, these properties are disabled by default. Using wls_setting you can enable them. Here is an example on how to enable all extended properties for wls_server

wls_setting { 'domain2':
  ...
  extra_properties   => ['wls_server:.*'],
}

With all extra_properties enabled, a puppet resource ofwls_server now returns:

$ puppet resource wls_server wlsonly/wls1
wls_server { 'wlsonly/wls1':
  ensure                                               => 'present',
  accept_backlog                                       => '300',
  add_work_manager_threads_by_cpu_count                => '0',
  admin_reconnect_interval_seconds                     => '10',
  administration_port                                  => '9002',
  administration_protocol                              => 't3s',
  allow_shrinking_priority_request_queue               => '1',
  arguments                                            => ['-XX:PermSize=64m', '-Xms768m', '-Xmx768m'],
  auto_kill_if_failed                                  => '0',
  auto_migration_enabled                               => '0',
  auto_restart                                         => '1',
  autokillwfail                                        => '0',
  buzz_enabled                                         => '0',
  buzz_port                                            => '0',
  classpath_servlet_disabled                           => '0',
  client_cert_proxy_enabled                            => '0',
  client_certificate_enforced                          => '0',
  cluster_weight                                       => '100',
  com_enabled                                          => '0',
  complete_com_message_timeout                         => '-1',
  complete_http_message_timeout                        => '-1',
  complete_iiop_message_timeout                        => '-1',
  complete_message_timeout                             => '60',
  complete_t3_message_timeout                          => '-1',
  complete_write_timeout                               => '60',
  connect_timeout                                      => '0',
  custom_identity                                      => '0',
  custom_identity_key_store_pass_phrase                => '<encrypted value>',
  custom_trust_key_store_pass_phrase                   => '<encrypted value>',
  default_iiop_password                                => '<encrypted value>',
  default_internal_servlets_disabled                   => '0',
  default_protocol                                     => 't3',
  default_secure_protocol                              => 't3s',
  default_tgiop_password                               => '<encrypted value>',
  default_tgiop_user                                   => 'guest',
  dgc_idle_periods_until_timeout                       => '5',
  eager_thread_local_cleanup                           => '0',
  frontendhttpport                                     => '0',
  frontendhttpsport                                    => '0',
  gathered_writes_enabled                              => '0',
  graceful_shutdown_timeout                            => '0',
  health_check_interval_seconds                        => '180',
  health_check_start_delay_seconds                     => '120',
  health_check_timeout_seconds                         => '60',
  hosts_migratable_services                            => '1',
  http_trace_support_enabled                           => '0',
  httpd_enabled                                        => '1',
  idle_connection_timeout                              => '65',
  idle_iiop_connection_timeout                         => '-1',
  idle_periods_until_timeout                           => '4',
  ignore_sessions_during_shutdown                      => '0',
  iiop_enabled                                         => '1',
  iiop_tx_mechanism                                    => 'ots',
  instrument_stack_trace_enabled                       => '1',
  java_compiler                                        => 'javac',
  java_standard_trust_key_store_pass_phrase            => '<encrypted value>',
  jdbc_logging_enabled                                 => '0',
  jdbc_login_timeout_seconds                           => '0',
  jms_connection_factory_unmapped_res_ref_mode         => 'ReturnDefault',
  jms_default_connection_factories_enabled             => '1',
  jsseenabled                                          => '1',
  key_stores                                           => 'DemoIdentityAndDemoTrust',
  listen_address                                       => '10.10.10.30',
  listen_delay_secs                                    => '0',
  listen_port                                          => '7001',
  listen_port_enabled                                  => '1',
  listen_thread_start_delay_secs                       => '60',
  listenaddress                                        => '10.10.10.30',
  listeners_bind_early                                 => '0',
  listenport                                           => '7001',
  listenportenabled                                    => '1',
  log_buffer_size_kb                                   => '8',
  log_datasource_filename                              => 'logs/datasource.log',
  log_date_format_pattern                              => 'MMM d, yyyy h:mm:ss a z',
  log_date_pattern                                     => 'MMM d, yyyy h:mm:ss a z',
  log_domain_log_broadcast_severity                    => 'Notice',
  log_domain_log_broadcaster_buffer_size               => '10',
  log_file_count                                       => '10',
  log_file_min_size                                    => '5000',
  log_file_name                                        => '/wls1.log',
  log_file_severity                                    => 'Trace',
  log_file_time_span                                   => '24',
  log_filecount                                        => '10',
  log_http_file_count                                  => '10',
  log_http_filename                                    => 'logs/access.log',
  log_http_format                                      => 'date time cs-method cs-uri sc-status',
  log_http_format_type                                 => 'common',
  log_http_number_of_files_limited                     => '1',
  log_log4j_logging_enabled                            => '0',
  log_logger_severity                                  => 'Info',
  log_memory_buffer_severity                           => 'Trace',
  log_memory_buffer_size                               => '500',
  log_monitoring_enabled                               => '1',
  log_monitoring_interval_secs                         => '30',
  log_monitoring_throttle_message_length               => '50',
  log_monitoring_throttle_threshold                    => '1500',
  log_number_of_files_limited                          => '1',
  log_redirect_stderr_to_server                        => '0',
  log_redirect_stderr_to_server_log_enabled            => '0',
  log_redirect_stdout_to_server                        => '0',
  log_redirect_stdout_to_server_log_enabled            => '0',
  log_remote_exceptions_enabled                        => '0',
  log_rotate_log_on_startup                            => '1',
  log_rotate_logon_startup                             => '1',
  log_rotation_time                                    => '00:00',
  log_rotation_type                                    => 'bySize',
  log_rotationtype                                     => 'bySize',
  log_server_logging_bridge_use_parent_loggers_enabled => '0',
  log_stdout_format                                    => 'standard',
  log_stdout_log_stack                                 => '1',
  log_stdout_severity                                  => 'Notice',
  logfilename                                          => '/wls1.log',
  login_timeout_millis                                 => '5000',
  logintimeout                                         => '5000',
  low_memory_gc_threshold                              => '5',
  low_memory_granularity_level                         => '5',
  low_memory_sample_size                               => '10',
  low_memory_time_interval                             => '3600',
  machine                                              => 'wls_machine_1',
  managed_server_independence_enabled                  => '1',
  max_com_message_size                                 => '-1',
  max_concurrent_long_running_requests                 => '100',
  max_concurrent_new_threads                           => '100',
  max_http_message_size                                => '-1',
  max_iiop_message_size                                => '-1',
  max_message_size                                     => '10000000',
  max_open_sock_count                                  => '-1',
  max_t3_message_size                                  => '-1',
  message_id_prefix_enabled                            => '0',
  messaging_bridge_thread_pool_size                    => '5',
  msi_file_replication_enabled                         => '0',
  muxer_class                                          => 'weblogic.socket.NIOSocketMuxer',
  native_io_enabled                                    => '1',
  nm_socket_create_timeout_in_millis                   => '180000',
  notes                                                => 'None',
  num_of_retries_before_msi_mode                       => '3',
  outbound_enabled                                     => '0',
  outbound_private_key_enabled                         => '0',
  period_length                                        => '60000',
  print_stack_trace_in_production                      => '0',
  resolve_dns_name                                     => '0',
  restart_delay_seconds                                => '0',
  restart_interval_seconds                             => '3600',
  restart_max                                          => '2',
  retry_interval_before_msi_mode                       => '5',
  reverse_dns_allowed                                  => '0',
  scattered_reads_enabled                              => '0',
  server_life_cycle_timeout_val                        => '120',
  server_parameters                                    => 'None',
  server_version                                       => 'unknown',
  socket_buffer_size_as_chunk_size                     => '0',
  socket_readers                                       => '-1',
  ssl_accept_kss_demo_certs_enabled                    => '1',
  ssl_allow_unencrypted_null_cipher                    => '0',
  ssl_client_cert_private_key_pass_phrase              => '<encrypted value>',
  ssl_client_certificate_enforced                      => '0',
  ssl_enabled                                          => '0',
  ssl_export_key_lifespan                              => '500',
  ssl_hostname_verification_ignored                    => '1',
  ssl_identity_and_trust_locations                     => 'KeyStores',
  ssl_inbound_certificate_validation                   => 'BuiltinSSLValidationOnly',
  ssl_jsse_enabled                                     => '1',
  ssl_listen_port                                      => '7002',
  ssl_login_timeout_millis                             => '25000',
  ssl_outbound_certificate_validation                  => 'BuiltinSSLValidationOnly',
  ssl_rejection_logging_enabled                        => '1',
  ssl_server_certificate_chain_file_name               => 'server-certchain.pem',
  ssl_server_certificate_file_name                     => 'server-cert.der',
  ssl_server_key_file_name                             => 'server-key.der',
  ssl_server_private_key_pass_phrase                   => '<encrypted value>',
  ssl_ss_lv2_hello_enabled                             => '1',
  ssl_trusted_ca_file_name                             => 'trusted-ca.pem',
  ssl_two_way_ssl_enabled                              => '0',
  ssl_use_client_cert_for_outbound                     => '0',
  ssl_use_server_certs                                 => '0',
  sslenabled                                           => '0',
  sslhostnameverificationignored                       => '1',
  ssllistenport                                        => '7002',
  staging_directory_name                               => '/opt/oracle/domains/wlsonly/servers/wls1/stage',
  staging_mode                                         => 'stage',
  startup_mode                                         => 'RUNNING',
  startup_timeout                                      => '0',
  stuck_thread_max_time                                => '600',
  stuck_thread_timer_interval                          => '60',
  tgiop_enabled                                        => '1',
  thread_pool_percent_socket_readers                   => '33',
  transaction_log_file_prefix                          => './',
  transaction_log_file_write_policy                    => 'Direct-Write',
  tunneling_client_ping_secs                           => '45',
  tunneling_client_timeout_secs                        => '40',
  tunneling_enabled                                    => '1',
  tunnelingenabled                                     => '1',
  two_way_ssl                                          => '0',
  upload_directory_name                                => './servers/wls1/upload',
  use81_style_execute_queues                           => '0',
  use_concurrent_queue_for_request_manager             => '0',
  use_detailed_thread_name                             => '0',
  use_enhanced_increment_advisor                       => '1',
  use_enhanced_priority_queue_for_request_manager      => '0',
  use_fusion_for_llr                                   => '0',
  useservercerts                                       => '0',
  verbose_ejb_deployment_enabled                       => 'false',
  virtual_machine_name                                 => 'wlsonly_wls1',
  weblogic_plugin_enabled                              => '0',
}

As you can see, this is a HUGE list of properties.

Lifecycle Management

Most customers are using these modules already a long time. This means they have gone through some changes in their manifests already. Version 2 of the module allowed you to set the property values. But there was no consistent way to reset the values. We have fixed that. In line with the puppet standards, you can now set most properties to absent. Setting them to absent means resetting them to the original default value WebLogic uses. With this change it has become much easier to manage changes through their lifecycle.

Getting started

Getting started is as easy as updating the version number in your Puppefile. This new version is fully backwards compatible, and upgrading is a breeze. We have worked on this version with a lot of pleasure. We hope you like it.

Comments